package com.terren.spider.util.common;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import us.codecraft.webmagic.selector.Json;

public class JSONUtil {

	/**
	 * json 转换 map
	 * 
	 * @param json
	 * @return
	 */
	public static Map<String, String> json2Map(String json) {
		Gson gson = new Gson();
		Type type = new TypeToken<Map<String, String>>() {
		}.getType();
		Map<String, String> map = gson.fromJson(json, type);
		return map;
	}

	public static <T> List<T> fromJsonList(String json, Class<T> clazz) {
		if (null == json || "".equals(json)) {
			return null;
		}
		List<T> lst = new ArrayList<T>();
		try {
			JsonArray array = new JsonParser().parse(json).getAsJsonArray();
			for (final JsonElement elem : array) {
				lst.add(new Gson().fromJson(elem, clazz));
			}
		} catch (Exception e) {
		}
		return lst;
	}

	/**
	 * 获取json数据中某个节点下的json
	 * 
	 * @param data
	 * @param jsonNode
	 * @return
	 */
	public static String filterJson(String data, String jsonNode) {
		String filterData = null;
		Gson gson = new Gson();
		Type type = new TypeToken<Map<String, Object>>() {
		}.getType();
		Map<String, Object> myMap = gson.fromJson(data, type);

		filterData = gson.toJson(myMap.get(jsonNode));
		return filterData;
	}

	public static String select(String jsonStr, String jsonPath) {
		if (null == jsonStr) {
			return null;
		}
		us.codecraft.webmagic.selector.Json json = new Json(jsonStr);
		return json.jsonPath(jsonPath).get();
	}

	public static List<String> selectList(String jsonStr, String jsonPath) {
		if (null == jsonStr) {
			return null;
		}
		us.codecraft.webmagic.selector.Json json = new Json(jsonStr);
		return json.jsonPath(jsonPath).all();
	}

	/**
	 * 得到对象的JSON
	 * 
	 * @param obj
	 * @return
	 */
	public static String toJSONString(Object obj) {
		return JSON.toJSONString(obj);
	}
}
